package com.xhj.mybatis.reflection;


import com.xhj.mybatis.util.MapUtil;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * DefaultReflectorFactory
 *
 * @author XJks
 * @description 默认的 ReflectorFactory 实现类，负责创建和缓存 Reflector 实例。TODO:主要作用是负责按类名缓存/创建 Reflector，避免重复解析，把“类的反射结构”变成一个可快速查询的索引表。
 */
public class DefaultReflectorFactory implements ReflectorFactory {
    /**
     * 是否启用类缓存，默认为 true，表示会缓存 Reflector 实例
     */
    private boolean classCacheEnabled = true;

    /**
     * 用于缓存每个类对应的 Reflector 实例，提升反射性能
     */
    private final ConcurrentMap<Class<?>, Reflector> reflectorMap = new ConcurrentHashMap<>();

    /**
     * 构造方法
     */
    public DefaultReflectorFactory() {
    }

    @Override
    public boolean isClassCacheEnabled() {
        return classCacheEnabled;
    }

    @Override
    public void setClassCacheEnabled(boolean classCacheEnabled) {
        this.classCacheEnabled = classCacheEnabled;
    }

    @Override
    public Reflector findForClass(Class<?> type) {
        if (classCacheEnabled) {
            // 如果启用了缓存，则从缓存中获取 Reflector，没有则创建并放入缓存
            // MapUtil.computeIfAbsent 保证线程安全地获取或创建 Reflector
            return MapUtil.computeIfAbsent(reflectorMap, type, Reflector::new);
        } else {
            // 如果未启用缓存，则每次都新建 Reflector 实例
            return new Reflector(type);
        }
    }

}
